找到关于操作系统的2047篇文章

进程在内存中是什么样的?

Arnab Chakraborty
更新于 2019年10月11日 13:04:47

4K+ 次浏览

加载到内存并执行的程序称为进程。简单来说,进程就是正在执行的程序。当创建程序时,它只是一些存储在硬盘中的被动实体字节。然后,程序开始加载到内存中并成为活动实体,当在 Windows 中双击程序或在命令行中输入可执行文件的名称时。(例如 a.out 或 prog.exe)让我们看看每个内存段以及进程在内存中的样子-图:内存中的进程进程不仅仅是……阅读更多

使用互斥锁的死锁

Arnab Chakraborty
更新于 2019年10月11日 13:01:45

6K+ 次浏览

使用互斥锁的多线程 Pthread 程序中可能会发生死锁。让我们看看它是如何发生的。未锁定的互斥锁由 pthread_mutex_init() 函数初始化。使用 pthread_mutex_lock() 和 pthread_mutex_unlock() 获取和释放互斥锁。如果线程尝试获取锁定的互斥锁,则对 pthread_mutex_lock() 的调用会阻塞线程,直到互斥锁的所有者调用 pthread_mutex_unlock()。让我们来看一个例子,在下面的代码中创建了两个互斥锁-/* 创建并初始化互斥锁 */ pthread_mutex_t mutex1; pthread_mutex_t mutex2; pthread_mutex_init(&mutex1, NULL); pthread_mutex_init(&mutex2, NULL);接下来,两个线程……阅读更多

事务内存

Arnab Chakraborty
更新于 2019年10月11日 12:58:19

719 次浏览

事务内存起源于数据库理论,提供了一种进程同步的替代策略。内存事务是原子的,是一系列内存读写操作。如果事务中的所有操作都已完成,则提交内存事务。否则,必须中止并回滚操作。可以通过添加到编程语言的功能来获得事务内存的易用性。考虑一个例子。假设我们有一个修改共享数据的函数 update()。传统上,此函数将使用互斥锁(或信号量)编写,如下所示-void update (){    acquire(); /* 修改共享数据 */   ...阅读更多

Solaris中的进程同步

Arnab Chakraborty
更新于 2019年10月11日 12:56:30

2K+ 次浏览

Solaris 实现各种锁来支持多任务处理、多线程和多处理。它使用自适应互斥锁、条件变量、信号量、读写锁、旋转门来控制对临界区的访问。自适应互斥锁用于保护每个临界数据项,这些数据项仅由短代码段访问。在多处理器系统上,它从标准信号量自旋锁开始。如果锁由在另一个 CPU 上运行的线程持有,则线程会自旋。如果锁由当前处于运行状态的线程持有,则线程会阻塞,进入睡眠状态,直到被信号唤醒……阅读更多

Windows中的进程同步

Arnab Chakraborty
更新于 2019年10月11日 12:53:41

2K+ 次浏览

Windows操作系统是一个多线程内核,它为实时应用程序和多处理器提供支持。在单处理器系统上,Windows 提供中断掩码来保护对全局资源的访问。它使用自旋锁来保护对全局资源的访问。内核仅使用自旋锁来保护短代码段,例如 Solaris。内核确保在持有自旋锁时,线程永远不会被抢占。Windows 根据几种不同的机制(包括互斥锁、信号量、事件和计时器)提供调度程序对象用于线程同步。系统通过要求线程获取互斥锁的所有权来访问数据来保护共享数据,并且……阅读更多

如何使用信号量实现监视器?

Arnab Chakraborty
更新于 2019年10月11日 12:51:49

2K+ 次浏览

要使用信号量实现监视器,对于每个监视器,都会提供一个信号量互斥锁(初始化为 1)。进程必须在进入监视器之前执行 wait(mutex),并且必须在离开监视器后执行 signal(mutex)。由于信号进程必须等到恢复的进程离开或等待,因此引入了另一个初始化为 0 的信号量 next。信号进程可以使用 next 来挂起自身。还提供了一个整型变量 next_count 来计算挂起在 next 上的进程数。因此,每个外部函数 F 都被替换为-wait(mutex); … F 的主体 ... ...阅读更多

Grand Central Dispatch (GCD)

Arnab Chakraborty
更新于 2019年10月11日 12:48:37

731 次浏览

Grand Central Dispatch (GCD)——Apple 的 Mac OS X 和 iOS 操作系统的一项技术——是 C 语言扩展、API 和运行时库的组合,允许应用程序开发人员识别要并行运行的代码段。与 OpenMP 一样,GCD 管理线程的大部分细节。GCD 识别对 C 和 C++ 语言的扩展,称为块。块只是一个自包含的工作单元。它由插入在一对花括号 { } 前面的脱字符号 ˆ 指定。下面显示了一个简单的块示例……阅读更多

什么是 OpenMP?

Arnab Chakraborty
更新于 2019年10月11日 12:45:48

7K+ 次浏览

OpenMP 是一组编译器指令以及用于用 C、C++ 或 FORTRAN 编写的程序的 API,它为共享内存环境中的并行编程提供支持。OpenMP 将并行区域识别为可以并行运行的代码块。应用程序开发人员在其代码的并行区域插入编译器指令,这些指令指示 OpenMP 运行时库并行执行该区域。以下 C 程序在包含 printf() 语句的并行区域上方说明了一个编译器指令-#include #include int main(int argc, char *argv[]){    /* 顺序代码 */    #pragma omp ...阅读更多

数据并行与任务并行

Arnab Chakraborty
更新于 2019年10月11日 12:42:35

18K+ 次浏览

数据并行数据并行意味着在每个多个计算核心上并发执行相同的任务。让我们来看一个例子,对大小为 N 的数组的内容求和。对于单核系统,一个线程会简单地对元素 [0] ... [N − 1] 求和。但是,对于双核系统,在核心 0 上运行的线程 A 可以对元素 [0] ... [N/2 − 1] 求和,而同时在核心 1 上运行的线程 B 可以对元素 [N/2] ... [N − 1] 求和。因此,两个线程将在单独的计算核心上并行运行。任务并行任务……阅读更多

处理执行中的并行类型

Arnab Chakraborty
更新于 2019年10月11日 12:37:49

15K+ 次浏览

数据并行数据并行意味着在每个多个计算核心上并发执行相同的任务。让我们来看一个例子,对大小为 N 的数组的内容求和。对于单核系统,一个线程会简单地对元素 [0] ... [N − 1] 求和。但是,对于双核系统,在核心 0 上运行的线程 A 可以对元素 [0] ... [N/2 − 1] 求和,而同时在核心 1 上运行的线程 B 可以对元素 [N/2] ... [N − 1] 求和。因此,两个线程将在单独的计算核心上并行运行。任务并行任务……阅读更多

广告