【Linux】系统调用简单了解

系统调用决定了操作系统是否好用,功能是否齐全。

进程管理

创建进程:fork

原进程叫父进程,新进程叫子进程。

当父进程fork创建子进程时,采用写时拷贝的方案。先是父子共用同一内存,如果有一方要写数据,就会将该内存块进行拷贝。然后再写。

fork可以根据返回值进行对父子进程的区分。

  • 返回0,说明是子进程。
  • 返回非0,说明是父进程,返回的值为子进程的进程号。

子进程可以使用exec函数族去执行另一个程序。

父进程可以通过waitpid系统调用,通过传入子进程进程号,来让父进程知道子进程的运行状态。


内存管理

每个进程都有自己独立的内存空间。

该内存空间会放入程序的代码(代码段),程序的数据(数据段)。

(这里牵扯到物理分段分页问题)

分配内存的时候使用的系统调用,brk和mmap

  • brk分配的内存是和原来的堆连在一起的,通过调整堆的上线来扩大堆。
  • mmap是在映射区重新划分一块内存区域。

文件管理

在Linux下一切皆文件。

  • 程序,进程:可执行二进制文件
  • 配置文件:文本文件
  • 进程间通信的管道,Socket:也是文件
  • 设备的存储形式也是吻技安。

每一个文件,Linux都会分配一个文件描述符(一个整数),我们一般通过这个文件描述符来使用系统调用。


信号

程序执行过程中遇到异常等情况就会发生中断,发送信号给进程,进程收到信号后进一步处理。

一般不重要的会忽略,重要的一般都会默认终止。


进程间通信

一般发送的数据不长,可以使用消息队列。消息队列是在内核中。

发送的数据较大,可以使用共享内存。也就是两个进程同时使用一块内存。当然为了解决两个进程同时读写一块内存造成的不确定性问题,引入了信号量。它可以让这部分程序同一时间只有一个进程可以访问。


网络通信

不同机器之间的通信使用的就是网络通信,遵从网络协议(TCP/IP网络协议栈)。网络服务是通过Socket套接字来提供。


Glibc

在Linux下有一个开源的标准C库就是Glibc。它不仅提供了丰富的API,还封装了系统调用。

猜你喜欢

转载自www.cnblogs.com/LampsAsarum/p/12235000.html