1.进程通信的方式
进程通信IPC——inter process communication,通信方式主要有:
- 管道pipe,管道是一种半双工单向通信的方式,适用于亲缘关系的进程,通常指父进程与子进程。
- 有名管道named pipe,与管道类似,不同在于它适用于所有的进程,而不知是亲缘关系进程。
- 信号量semophone,某个资源可能会被多个进程同时访问,为了保证进程不冲突,使用信号量来确保同一时间只有一个进程在访问资源。通常是一种锁机制,用来使进程与进程或同一进程间多个线程同步。
- 消息队列message queue,存放于内核中。
- 信号signal,用来通知某个接受进程某个事件已经发生。
- 共享内存shared memory,有一个进程创建出一片共享的内存块,可被其他进程访问,是最快的IPC方式。
- 套接字socket,socket是一种通信接口,通常适用于internet的通信。
2.线程同步的几种方式
临界区,当多个线程访问一个独占资源时,临界区保证了同一时间只有一个线程在访问,其他线程会被挂起,知道访问进程退出临界区,在由其他线程竞争。
互斥量,类似于临界区,不同的是互斥量支持进程兼得同步,而临界区是线程间的。
事件,某个事件发生后,可以去执行接下来的任务,允许进程在执行某个事件后,唤醒其他进程去执行任务。
信号量,当需要限制访问共享资源的线程个数时,使用信号量,信号量通过使用PV操作来实现同步。
3.线程实现的方式
线程分为内核线程KST(Kernal Support Thread)与用户线程ULT(User Level Thread)。
内核线程由系统创建,管理,调度,所以系统回为线程安排时间片,一旦某个线程阻塞,不会影响其他线程,但是内核线程有内核管理,线程的创建以及用户态/内核态的模式切换代价都比较大,所以效率比较低。
用户线程是由用户程序来进行创建,调度,管理。相对于内核线程来说,更加灵活,由于是在用户态上的管理,所以代价比内核管理要少,效率更高,缺点是并发性不足,一旦一个线程进入阻塞态,那么其他线程都会阻塞,因为用户线程没有时间片的概念。
4.用户态和内核态的区别
用户态和内核态是操作系统运行的两种级别,当一个进程执行系统调用而进入内核代码中,称其处于内核态,内核态下cpu处于拥有系统最高权限的内核代码中,执行内核代码会用到当前进程的内核棧,每个进程都有自己的内核棧;当进程在执行用户代码的时候,cpu处于系统最低权限的用户代码中运行。
内核态下cpu可以执行任何指令,用户态下只能执行非特权指令。内核态可以随时切换到用户态,而用户态切换大内核态只有通过系统调用和中断才行。一般一个程序是先在用户态下执行,需要使用系统调用时,通过软中断来进入内核态。
5.用户棧和内核棧的区别
转:内核创建进程,会为进程创建两个棧,用户棧和内核棧。用户棧——存在于用户空间,当进程出于用户态时cpu堆栈指针寄存器存放用户棧的地址,使用用户棧;当进程出于内核态时,cpu堆栈指针寄存器存放内核棧地址,使用内核棧。
当由用户态切换到内核态时,首先将用户棧地址存在内核棧,然后让cpu堆栈指向内存棧;由内核态切换到用户态,将内核棧保存的用户棧地址回复为cpu堆栈指针内容即可。
我们是如何知道内核地址的呢?关键在于进程从用户态到内核态转换后,内核棧总是空的,因为用户态使用用户棧,转换到内核态,内核棧保存进程在内核中运行的信息。但是进程从内核态再到用户态时,内核棧就会被清空。(这个我认为是因为用户态的权限原因,无法获取内核态的信息,所以为空)所以进入内核态,只需将内核棧棧顶地址设置为cpu堆栈内容。 |