【Linux】系统调用简单了解
系统调用决定了操作系统是否好用,功能是否齐全。
进程管理
创建进程:fork
原进程叫父进程,新进程叫子进程。
当父进程fork创建子进程时,采用写时拷贝的方案。先是父子共用同一内存,如果有一方要写数据,就会将该内存块进行拷贝。然后再写。
fork可以根据返回值进行对父子进程的区分。
- 返回0,说明是子进程。
- 返回非0,说明是父进程,返回的值为子进程的进程号。
子进程可以使用exec函数族去执行另一个程序。
父进程可以通过waitpid系统调用,通过传入子进程进程号,来让父进程知道子进程的运行状态。
内存管理
每个进程都有自己独立的内存空间。
该内存空间会放入程序的代码(代码段),程序的数据(数据段)。
(这里牵扯到物理分段分页问题)
在堆分配内存的时候使用的系统调用,brk和mmap。
- brk分配的内存是和原来的堆连在一起的,通过调整堆的上线来扩大堆。
- mmap是在映射区重新划分一块内存区域。
文件管理
在Linux下一切皆文件。
- 程序,进程:可执行二进制文件
- 配置文件:文本文件
- 进程间通信的管道,Socket:也是文件
- 设备的存储形式也是吻技安。
每一个文件,Linux都会分配一个文件描述符(一个整数),我们一般通过这个文件描述符来使用系统调用。
信号
程序执行过程中遇到异常等情况就会发生中断,发送信号给进程,进程收到信号后进一步处理。
一般不重要的会忽略,重要的一般都会默认终止。
进程间通信
一般发送的数据不长,可以使用消息队列。消息队列是在内核中。
发送的数据较大,可以使用共享内存。也就是两个进程同时使用一块内存。当然为了解决两个进程同时读写一块内存造成的不确定性问题,引入了信号量。它可以让这部分程序同一时间只有一个进程可以访问。
网络通信
不同机器之间的通信使用的就是网络通信,遵从网络协议(TCP/IP网络协议栈)。网络服务是通过Socket套接字来提供。
Glibc
在Linux下有一个开源的标准C库就是Glibc。它不仅提供了丰富的API,还封装了系统调用。