进程

Erlang学习第二天

|▌冷眼眸甩不掉的悲伤 提交于 2020-12-31 09:32:02
今天学习erlang的进程,并发编程。erlang的并发编程很简单,只有三个原语: 1)产生进程, spawn 2) 发送消息 ! 3) 消息接收 receive ... end erlang进程之间通过消息进行传递。 今天用一个进程字典作为联系,也就是put,get. 向目标进程插入数据,然后查询数据,就那么简单。 代码如下: -module(servertest). -export([start/0, stop/0, myget/1, myset/2]). %insertdata()-> % put(zhangsanfeng, {age,18,sex,man}), % put(zhangwuji, {age,25,sex,man}), % put(linghuchong, {age,34,sex,man}), % put(miejueshitai, {age,34,sex,woman}). %开启服务 start()-> register(testserver, spawn(fun loop/0)). %结束服务 stop()-> testserver!stop. %查询进程字典 myget(Key)-> testserver!{self(), get, Key}, receive {_Pid, Response} -> Response end. %设置进程字典 myset

Linux 线程 进程 经典文章

£可爱£侵袭症+ 提交于 2020-04-12 09:22:42
//出处已不明 一.基础知识:线程和进程 按照教科书上的定义,进程是资源管理的最小单位,线程是程序执行的最小单位。在操作系统设计上,从进程演化出线程,最主要的目的就是更好的支持SMP以及减小(进程/线程)上下文切换开销。 无论按照怎样的分法,一个进程至少需要一个线程作为它的指令执行体,进程管理着资源(比如cpu、内存、文件等等),而将线程分配到某个cpu上执行。一个进程当然可以拥有多个线程,此时,如果进程运行在SMP机器上,它就可以同时使用多个cpu来执行各个线程,达到最大程度的并行,以提高效率;同时,即使是在单cpu的机器上,采用多线程模型来设计程序,正如当年采用多进程模型代替单进程模型一样,使设计更简洁、功能更完备,程序的执行效率也更高,例如采用多个线程响应多个输入,而此时多线程模型所实现的功能实际上也可以用多进程模型来实现,而与后者相比,线程的上下文切换开销就比进程要小多了,从语义上来说,同时响应多个输入这样的功能,实际上就是共享了除cpu以外的所有资源的。 针对线程模型的两大意义,分别开发出了核心级线程和用户级线程两种线程模型,分类的标准主要是线程的调度者在核内还是在核外。前者更利于并发使用多处理器的资源,而后者则更多考虑的是上下文切换开销。在目前的商用系统中,通常都将两者结合起来使用,既提供核心线程以满足smp系统的需要,也支持用线程库的方式在用户态实现另一套线程机制

进程与线程的概念

不想你离开。 提交于 2020-03-20 23:49:21
3 月,跳不动了?>>> 1.并行和并发 并行性是指两个或多个时间在同一时刻发生,而并发性是指两个或多个事件在同一时间间隔内发生 。在多道程序环境下,并发性是指在一段时间内宏观有多个程序在同时运行,但在单处理机系统中每一时刻却仅能有一道程序执行,故微观上这些程序只能是分时地交替执行。倘若在计算机系统中有多个处理机,则这些可以并发执行的程序便可分配到多个处理机上,实现并行执行,即利用每个处理机来处理一个可并发执行的程序,这样,多个程序便可同时执行。 2.进程 通常的程序是静态实体(PassiveEntity),在多道程序系统中,它们是不能独立运行的,更不能和其它程序并发执行。 在操作系统中引入进程的目的,就是为了使多个程序能并发执行。例如,在一个未引入进程的系统中,在属于同一个应用程序的计算程序和I/O程序之间,两者只能是顺序执行,即只有在计算程序执行告一段落后,才允许I/O程序执行;反之,在程序执行I/O操作时,计算程序也不能执行,这意味着处理机处于空闲状态。但在引入进程后,若分别为计算程序和I/O程序各建立一个进程,则这两个进程便可并发执行。 由于在系统中具备使计算程序和I/O程序同事运行的硬件条件,因而可将系统中的CPU和设备同时开动起来,实现并行工作 ,从而有效提高资源的利用率和系统吞吐量,并改善系统的性能。 事实上可以在内存中存放多个用户程序,分别为他们建立进程后

进程,线程,超线程,并发,并行 等概念

我的梦境 提交于 2020-03-20 23:43:57
3 月,跳不动了?>>> 进程是操作系统对一个正在运行的程序的抽象,即操作系统为该进程虚拟了独自的处理器资源,内存空间(又称虚拟地址空间)与磁盘空间 线程是进程中多个可以派遣的工作单位(或称执行单元,以CPU的角度来看)的集合,同一进程的多个线程共享该线程的资源(包括运行时在虚拟地址空间加载的代码,全局数据等) 并发(concurrency)从最终用户的角度来看,就是同时运行多个本地应用程序(或者网络应用程序例如 web服务器 同时处理来自多个远程用户的页面请求 / 活动连接 的过程) 并发 从计算机底层实现原理来看,是CPU等硬件 在操作系统所抽象出来的多个进程(或线程)之间快速来回切换执行的过程;具体讲,某一极短时间间隔内,CPU只能执行一个进程(或线程) 超线程(hyper threading,HT)也称“同时多线程”(simultaneous multi-threading) 采用超线程技术的多核CPU的任意一个物理核心在某一极短时间间隔内可以“同时”执行两个或多个线程 例如传统的单线程CPU,在某一极短时间间隔内只能执行一个线程,单线程CPU在不同线程间切换需要20,000个时钟周期 超线程多核CPU的任意一个物理核心在不同线程间切换只需要一个时钟周期; 典型的例子是 Intel Core i7 四核心处理器,一个物理核心可以同时执行两个线程, 总共可以“并行

Linux内存点滴 用户进程内存空间

别来无恙 提交于 2020-03-20 23:30:05
3 月,跳不动了?>>> 经常使用top命令了解进程信息,其中包括内存方面的信息。命令top帮助文档是这么解释各个字段的。 VIRT, Virtual Image (kb) RES, Resident size (kb) SHR, Shared Mem size (kb) %MEM, Memory usage(kb) SWAP, Swapped size (kb) CODE, Code size (kb) DATA, Data+Stack size (kb) nFLT, Page Fault count nDRT, Dirty Pages count 尽管有注释,但依然感觉有些晦涩,不知所指何意? 进程内存空间 正在运行的程序,叫进程。每个进程都有完全属于自己的,独立的,不被干扰的内存空间。此空间,被分成几个段(Segment),分别是Text, Data, BSS, Heap, Stack。用户进程内存空间,也是系统内核分配给该进程的VM(虚拟内存),但并不表示这个进程占用了这么多的RAM(物理内存)。这个空间有多大?命令top输出的VIRT值告诉了我们各个进程内存空间的大小(进程内存空间随着程序的执行会增大或者缩小)。你还可以通过/proc//maps,或者pmap -d 了解某个进程内存空间都分布,比如: #cat /proc/1449/maps … 0012e000

linux fork函数执行过程。

假如想象 提交于 2020-03-02 06:40:51
这两天在看linux的fork函数,把这两天看到的消化一下,说说我的理解。 主要得益与两篇大牛的文章: 推荐先看这篇: 从一道面试题谈linux下的fork运行机制 再看这篇: Linux中fork()函数详解 第一篇虽然只有一个例子,但是感觉把fork的执行过程介绍很详尽,第二篇的例子很经典,但是对刚学的小白来说有点困难。 接下来谈谈看过之后我的总结与理解 首先必须明确一下几点: 1.进程在linux中成树状结构, init为根节点,其它进程均有父进程,某进程的父进程就是启动这个进程的进程,这个进程叫做父进程的子进程。 2.fork函数的作用就是创建一个子进程,子进程复制父进程的代码段,数据段,BSS段,堆,栈等所有用户空间的信息,在内核中操作系统为其重新申请了一个PCB,并且使用父进程的PCB来初始化,除了PID等特殊信息外,几乎所有的信息都是一样的 3.父子进程在创建了子进程后互相不关联,以独立身份抢占CPU资源,具体谁先执行有调度算法决定,用户空间没有办法干预, 4.子进程开始执行代码的位置是fork函数执行后的代码处,之前的都是继承父进程的 下面结合两个例子阐述一下fork的执行 例1: #include <stdio.h> #include <unistd.h> int main(){ int count = 0; pid_t = fork(); if(pid < 0)

进程之fork()函数的详细介绍

旧时模样 提交于 2020-03-02 05:15:54
内容介绍 本博文主要探讨fork函数以及execuv的用法。 头文件介绍 下面的是csapp.h头文件,后面的讨论中均只用该头文件来完成程序的编写。 /* $begin csapp.h */ #ifndef __CSAPP_H__ #define __CSAPP_H__ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <ctype.h> #include <setjmp.h> #include <signal.h> #include <sys/time.h> #include <sys/types.h> #include <sys/wait.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/mman.h> #include <errno.h> #include <math.h> #include <pthread.h> #include <semaphore.h> #include <sys/socket.h> #include <netdb.h> #include <netinet/in.h> #include <arpa/inet.h> /* Default file

Activity、Task、应用和进程

假如想象 提交于 2020-03-01 12:05:06
很想弄清楚启动一个Activity和Task(任务)的关系,网上也有很多相关资料,由从源码来具体分析的,也有针对launchmode来分析,但都不是自己的,理解起来总不是那么容易,为此,尝试着自己去理解其中的逻辑。不过事先需要弄清楚两个问题: 谁负责管理Activity? Android的framework框架中采用C/S的方式实现由后台服务ActivityManagerService(很多书上将其简称为Ams)来管理具体的Acitivity实例,虽然Ams命名为ActivityManagerService,但是它其实不仅仅管理Activity,他还管理除Acitvity外的其它三大组件,还包括Intent、pendingintent、apk进程和task等等,具体可以查看源码frameworks\base\services\java\com\android\server\am下面的Ams源码和相关的*Record类。 网上资料显示在2.3以后的SDK中,Ams将原来的HistoryRecord类重新命名为ActivityRecord类,并将其原来Ams中的一些处理抽出来成为一个ActivityStack类,每一个Activity实例对应一个ActivityRecord对象,并存放在ActivityStack中,手机一旦启动,就会启动一个Ams服务

Head First C 第九章 进程与系统调用 用fork()+exec()运行子进程

心已入冬 提交于 2020-02-29 14:01:39
Head First C 第九章 进程与系统调用 用fork()+exec()运行子进程 问题引入 :当你想循环使用exec调用另外一个程序时,发现只调用了一次就结束了。这是因为, exec函数通过运行新程序来替换当前程序 ,因此,后面的代码都没有运行。 为了达到我们想要的效果,在此引入 fork() 系统调用。 实例:RSS订阅功能 int main(int argc, char *argv[]) { char *feeds[] = {"http://www.cnn.com/rss/celebs.xml", "http://www.rollingstone.com/rock.xml", "http://eonline.com/gossip.xml"}; int times = 3; int i; char *phrase = argv[1]; for (i = 0; i < times; i++) { char var[255] = {}; sprintf(var, "RSS_FEED=%s", feeds[i]); char *vars[] = {var, NULL}; if (execle("/usr/bin/python", "/usr/bin/python", "rssgossip.py", phrase, NULL, vars) == -1) { fprintf

线程和进程的区别是什么?

谁说我不能喝 提交于 2020-02-29 07:48:11
首先来一句概括的总论: 进程和线程都是一个时间段的描述,是CPU工作时间段的描述。 下面细说背景 : CPU+RAM+各种资源(比如显卡,光驱,键盘,GPS, 等等外设)构成我们的电脑,但是电脑的运行,实际就是CPU和相关寄存器以及RAM之间的事情。 一个最最基础的事实 :CPU太快,太快,太快了,寄存器仅仅能够追的上他的脚步,RAM和别的挂在各总线上的设备完全是望其项背。那当多个任务要执行的时候怎么办呢?轮流着来?或者谁优先级高谁来?不管怎么样的策略,一句话就是在CPU看来就是轮流着来。 一个必须知道的事实 :执行一段程序代码,实现一个功能的过程介绍 ,当得到CPU的时候,相关的资源必须也已经就位,就是显卡啊,GPS啊什么的必须就位,然后CPU开始执行。这里除了CPU以外所有的就构成了这个程序的执行环境,也就是我们所定义的程序上下文。当这个程序执行完了,或者分配给他的CPU执行时间用完了,那它就要被切换出去,等待下一次CPU的临幸。在被切换出去的最后一步工作就是保存程序上下文,因为这个是下次他被CPU临幸的运行环境,必须保存。 串联起来的事实 :前面讲过在CPU看来所有的任务都是一个一个的轮流执行的,具体的轮流方法就是: 先加载程序A的上下文,然后开始执行A,保存程序A的上下文,调入下一个要执行的程序B的程序上下文,然后开始执行B,保存程序B的上下文 。。。 。 ========