初识进程
文章目录
- 一、进程的概念
- 1. 进程是什么及进程的管理
- 2. Linux 下的 pcb
- 3. 系统调用接口 getpid 和 getppid
- 4. 系统调用接口 fork
一、进程的概念
1. 进程是什么及进程的管理
在 Linux下 ./binaryfile 运行一个程序或者在 Windows下双击运行一个程序时,程序就变成了一个进程
根据冯诺依曼体系结构,程序运行起来后,程序的代码和数据就会被操作系统加载到内存,但一个程序仅仅被加载到内存,并不代表该程序就是进程
将这里的内存比作学校,程序比作人,进程比作学校的学生,如果一个人处在学校中,并不能说明这个人就是学校的人,如:学校的保安,食堂阿姨等这些并不是学生,只有那些被学校管理起来的,并且信息在学校的学生档案中的人才能被称作学生,所以只有程序被操作系统管理起来,并且程序的代码和数据的相关信息被操作系统记录了,这个程序才被称做进程
在学校中,当学生很多时,我们需要对学生进行管理,在操作系统中,当很多程序运行起来时,加载到内存中的代码便会很多,操作系统便需要对这些代码和数据进行管理
根据我们对管理进行的建模,可以知道操作系统对加载到内存中代码和数据的管理方式:先描述,在组织
-
先描述:为了管理程序运行后加载到内存中的代码和数据,操作系统采用了一个结构体对象 pcb,用来描述加载到内存中的代码和数据的相关属性,其中 pcb 中有一个内存指针,用来指向内存中的代码和数据
在国内的教材中 pcb(process control block) 统一称作进程,在国外有的叫做任务,Linux 下的 pcb 称做 task_struck
进程 = 内核中关于程序的相关结构体 + 程序的代码和数据 -
在组织:每一个加载到内存中的代码和数据操作系统都会为其创建一个 pcb 对象,因此我们可以在 pcb 对象中在加上 pcb 结构体指针,构成数据结构中的链表
Linux 下采用双链表的形式组织
当操作系统想新增一个进程时(启动一个程序),只需要创建一个 pcb,然后录入该程序的属性到 pcb 中,然后在链表中插入该 pcb
当操作系统想杀掉一个进程时(结束程序的运行),只需遍历链表,找到该进程的 pcb,然后通过内存指针释放 pcb 指向的内存中的代码和数据,在再链表中释放该 pcb 结点即可
当操作系统想查看一个进程的运行状态时(查看程序运行是否正常),只需要遍历链表,找到该进程的 pcb,然后查看状态信息即可
当操作系统想找到一个优先级别较高的进程执行时(让 CPU 运行指定程序),只需要遍历链表,找到该进程的 pcb,然后通过内存指针找到 pcb 指向的代码和数据,让 CPU 执行即可
通过先描述,再组织的方式,操作系统对进程的管理被完全的转换成了对 pcb 结构体组成的链表数据结构的增删查改
运行的可执行程序都要被操作系统转换为进程来调度以便完成特定的任务,因此当我们运行一个程序时,就称作 创建了一个进程
仅个人当前理解:软件其实就是一个在磁盘上的二进制文件,当软件运行起来后,便需要加载到内存,所以操作系统对进程的管理,便是对软件资源的管理
进程 = 内核中关于进程的相关数据结构 + 进程的代码和数据
2. Linux 下的 pcb
为了操作系统管理进程,需要描述出进程的共同属性,从而产生了结构体 pcb
task_struct 的字段
- 标识符:描述本进程的唯一标识符,用来区别进程
- 状态:任务状态,退出代码,退出信号等
- 优先级:相对于其他进程的优先级
- 程序计数器:程序中即将被执行的下一条指令的地址
- 内存指针:包括程序diamante和进程的相关数据结构的指针,还有和其他进程共享的内存块的指针
- …
pcb 和可执行程序的文件属性关系不大
3. 系统调用接口 getpid 和 getppid
如何证明程序运行起来,便成为了一个进程?
当我们创建一个进程时,操作系统就会在 /proc 目录下创建一个该进程 pid 为名的目录,该目录下存在该进程的属性(文件路径等),当进程终止时,/proc 目录中也会删除该进程 pid 为名的目录
预备知识1:
ps ajx:查看系统中所有的进程
ls /proc:查看系统中的所有进程,其中目录名为数字的表示进程的标识符 pid
[starrycat@iZ2vcer6gtjgqa43cdpeeaZ code]$ ps ajxPPID PID PGID SID TTY TPGID STAT UID TIME COMMAND0 1 1 1 ? -1 Ss 0 3:57 /usr/lib/systemd/systemd --system --deserialize 170 2 0 0 ? -1 S 0 0:00 [kthreadd]2 3 0 0 ? -1 S 0 0:08 [ksoftirqd/0]2 5 0 0 ? -1 S< 0 0:00 [kworker/0:0H]2 7 0 0 ? -1 S 0 0:00 [migration/0]
...
[starrycat@iZ2vcer6gtjgqa43cdpeeaZ code]$ ls /proc
1 14 21134 25405 28 350 47 539 6770 854 crypto interrupts kpagecount mtrr softirqs uptime
10 1523 21252 25512 280 36 49 557 6771 9 devices iomem kpageflags net stat version
101 15631 21262 26 29 365 5 587 7 acpi diskstats ioports loadavg pagetypeinfo swaps vmallocinfo
1019 16 22 27 296 37 50 598 787 buddyinfo dma irq locks partitions sys vmstat
...
预备知识2:
pid_t getpid(void):返回调用该函数的进程标识符 pid,需要包含头文件 <sys/types.h> 和 <unistd.h>
pid_t:有符号整形的 typedef
如果想了解更多关于 getpid 函数的内容,通过 man 2 getpid 即可查看
接下来通过代码证明程序运行起来,便成为了一个进程
在 process.c 中写好如下代码:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>int main()
{while(1){printf("我是一个进程了,我的 pid 是:%d\n", getpid());sleep(1);}return 0;
}
证明1:
打开新的窗口,通过命令查看发现,运行的程序 process 可以查到他的进程标识符 pid
其中 ps ajx | head -1 表示获取进程的第一行属性字段(便于观看)
&& 表示当前一条指令执行成功后执行后一条指令
ps ajx | grep process | grep -v grep 表示筛选出 process 的进程,并且去除掉 grep 这个进程
过程2:
用 ctrl + c 终止程序后,便查找不到该进程了
终上所述,程序运行起来后就变成了进程
在进程中存在着父子进程的概念
pid_t getppid(void):返回调用该函数的进程的父进程标识符 pid,需要包含头文件 <sys/types.h> 和 <unistd.h>
pid_t:有符号整形的 typedef
在 process.c 中写好如下代码:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>int main()
{while(1){printf("我是一个进程了,我的 pid 是:%d,我的 ppid 是:%d\n", getpid(), getppid());sleep(1);}return 0;
不断的执行 process 会发现子进程的进程标识符一直在增加,但是父进程的进程标识符 6771 一直不变,通过 ps 命令后可以发现 6771 这个进程标识符就是命令行解释器 bash,即命令行执行的程序都是通过创建子进程的方式去执行的,是为了避免执行的程序挂了,导致影响 bash 自己
命令行解释器 bash 其实就是在 /bin/bash 的一个二进制可执行程序,因此 bash 也是一个进程
命令行启动的所有程序,都是 bash 创建的子进程,为了防止子进程挂了,导致影响自己
4. 系统调用接口 fork
命令行是如何创建子进程的呢?
pid_t fork(void):如果创建子进程成功,则给调用该函数的父进程返回子进程的 pid,给子进程返回 0,如果失败则返回 -1,需要包含头文件 <sys/types.h> 和 <unistd.h>
- 在代码中执行到 fork 语句后,执行流变成了两个执行流
- fork 之后的代码,父子进程都会执行,因此我们可以用 if 语句来让执行流分流,以便父子进程执行不同的代码块
在 process.c 中写好如下代码:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>int main()
{pid_t ret = fork();if (ret == 0){// 执行子进程while (1){printf("我是子进程,我的 pid 是:%d,我的 ppid 是:%d\n", getpid(), getppid());sleep(1);}}else if (ret > 0){// 执行父进程 while (1){printf("我是父进程,我的 pid 是:%d,我的 ppid 是:%d\n", getpid(), getppid());sleep(1);}}else {}return 0;
}
- fork 创建子进程成功之后,父进程和子进程谁先被 CPU 调度运行是由操作系统决定的
可以通过 fork 系统调用来创建子进程
fork 创建子进程的过程:操作系统为了可以管理子进程,会根据父进程的 pcb 创建子进程的 pcb,并且子进程的 pcb 会和父进程的 pcb 指向同一块代码和数据
虽然父进程创建子进程后,子进程指向父进程的代码和数据,但是不同的进程在运行时是独立的,父子进程在运行时也是独立的
kill -9 pid 功能:杀掉进程
再次运行 process 之后,在另一个窗口中输入 kill -9 父进程 pid,此时子进程任然可以正常运行
父子进程是如何做到独立的呢?
- 在代码层面:可执行程序的代码都是二进制机器指令了,是只读的,不可能被修改,因此父子进程可以一起读代码,只需要记住自己进程执行代码的位置即可
- 在数据层面:Linux 操作系统采用写时拷贝的方式来保证数据的独立性,即:当某一个进程想要修改数据时,操作系统会自己拷贝一份数据到别的位置然后进行修改
为什么一个函数会有两个返回值?
因为一个函数在执行 return 之前,函数的主题功能已经完成了,对于 fork 函数,在 return 之前已经创建好子进程了,此时便有父子进程两个执行流,于是父子进程都会执行 return 语句,也就产生了两个返回值的现象
相关文章:
![](https://img-blog.csdnimg.cn/0004bb1a6a40482cb2b473b56487541d.png)
初识进程
文章目录一、进程的概念1. 进程是什么及进程的管理2. Linux 下的 pcb3. 系统调用接口 getpid 和 getppid4. 系统调用接口 fork一、进程的概念 1. 进程是什么及进程的管理 在 Linux下 ./binaryfile 运行一个程序或者在 Windows下双击运行一个程序时,程序就变成了一个…...
![](https://img-blog.csdnimg.cn/img_convert/58ee37bb913da6891e9217e993d2fb63.png)
SOAP传输协议
一.HTTP传输协议 超文本传输协议(HyperText Transfer Protocol,缩写:HTTP),它是基于请求-响应的模式协议,客户端发出请求,服务器端给出响应并返回请求内容。方法如下,HTTP传输协议常…...
![](https://img-blog.csdnimg.cn/img_convert/a88ce3dcf924e965987f3945488d49d1.png)
<Linux>进程控制
进程控制 文章目录进程控制一、进程创建1.fork函数认识2.写时拷贝3.fork常规用法4.fork调用失败的原因二、进程终止1.进程退出场景2.进程退出码3.进程退出的方式三、进程等待1.进程等待是什么?2.进程等待的必要性3.进程等待的方法3.1.wait函数3.2.waitpid函数4.如何…...
![](https://img-blog.csdnimg.cn/c7156499b38e42aea02763e85466a41d.gif#pic_center)
有手就行 -- 搭建图床(PicGo+腾讯云)
🍳作者:贤蛋大眼萌,一名很普通但不想普通的程序媛\color{#FF0000}{贤蛋 大眼萌 ,一名很普通但不想普通的程序媛}贤蛋大眼萌,一名很普通但不想普通的程序媛🤳 🙊语录:多一些不为什么的…...
![](https://img-blog.csdnimg.cn/af10d4baff644090b55901954364f450.png)
“蓝桥杯”递推和递归(一)——取数位
1. 算法简介 递推和递归虽然叫法不同,但它们的基本思想是一致的,在很多程序中,这两种算法可以通用,不同的是递推法效率更高,递归法更方便阅读。 (1)递推法 递推法是一种重要的数学方法&#…...
![](https://img-blog.csdnimg.cn/35740b4e96594f7a8dc34824c0030561.png#pic_center)
蓝桥杯·3月份刷题集训Day02
本篇博客旨在记录自已打卡蓝桥杯3月份刷题集训,同时会有自己的思路及代码解答希望可以给小伙伴一些帮助。本人也是算法小白,水平有限,如果文章中有什么错误之处,希望小伙伴们可以在评论区指出来,共勉💪。 文…...
![](https://www.ngui.cc/images/no-images.jpg)
python --获取内网IP地址
方法一 import socketdef get_local_ip_address():ip_address try:# 获取本机主机名hostname socket.gethostname()# 获取本机IPip_address socket.gethostbyname(hostname)except:passreturn ip_address方法二 import subprocessdef get_local_ip_address():ip_address …...
![](https://img-blog.csdnimg.cn/img_convert/a4b88a8ee602a21c7afc538d0f1a54f5.png)
如何衡量你的Facebook广告活动的成功
投入大量资金和资源在Facebook广告上并不总能带来预期的回报,这很可能是由于缺乏恰当的衡量广告活动成功的方法。在这篇文章中,我们将介绍一些关键的指标,帮助你更好地了解如何衡量你的Facebook广告活动的成功。1.费用每次点击(CP…...
![](https://www.ngui.cc/images/no-images.jpg)
Linux对一个目录及其子目录所有文件添加权限
1、chmod指令 chmod是一个改变用户拥有指定文件的权限的命令.r:只读,w:写,x执行.也可以用数字 -rw------- (600) -- 只有属主有读写权限。 -rw-r--r-- (644) -- 只有属主有读写权限;而属组用户和其他用户只有读权限。 -rwx------ (700) -- 只有属主有读、写、执…...
![](https://img-blog.csdnimg.cn/ec83ac38b7554f2db34e9723a62f477f.png)
宝刀未老?低代码何德何能受大厂们的推崇
风口之下,低代码蓬勃发展,本文从国内低代码的走红现象引入,浅析低代码发展中的变化趋势,重点探讨如此趋势之下,国内大厂如何通过低代码实现了良性发展。 一、国内爆火的低代码 据Gartner最新报告显示,到2…...
![](https://img-blog.csdnimg.cn/c191cce6f707497c97a0c2353d4a692d.png#pic_center)
智能扑克牌识别软件(Python+YOLOv5深度学习模型+清新界面)
摘要:智能扑克牌识别软件利用视觉方法检测和识别日常扑克牌具体花色与数字,快速识别牌型并标注结果,帮助计算机完成扑克牌对战的前期识别步骤。本文详细介绍基于深度学习的智能扑克牌识别软件,在介绍算法原理的同时,给…...
![](https://img-blog.csdnimg.cn/img_convert/a218ff8d7178c2c31a8d8cb86efc02f9.png)
SQL优化13连问,收藏好!
1.日常工作中,你是怎么优化SQL的? 大家可以从这几个维度回答这个问题: 分析慢查询日志 使用explain查看执行计划 索引优化 深分页优化 避免全表扫描 避免返回不必要的数据(如select具体字段而不是select*) 使用…...
![](https://img-blog.csdnimg.cn/0a148b095e914909b94a3d70647f3db6.png#pic_center)
【小技巧】公式从docx文件复制到doc文件变成了图片怎么办?
文章目录0、word文件后缀命名1、docx和doc默认的公式编辑方式2、MathTpye公式编辑器3、MathType 运行时错误‘53’:文件未找到:MathPage.WLL4、结束语0、word文件后缀命名 1997-2003的旧版本文件名后缀是.doc 从2007版以后,后缀名是.docx…...
![](https://img-blog.csdnimg.cn/08d92273a97c427fb2d572b9d360c0cd.png)
Python3入门与进阶笔记(六):初识类
目录 一些解释 属性 类名建议首字母大写,通常用驼峰规则命名。变量名建议小写,下划线隔开。类最基本的作用是封装。 写在类内非方法中的语句在类加载的时候会执行,且只会执行一次,例如下面的print语句,类加载时就会…...
![](https://img-blog.csdnimg.cn/56b9e5ddc0e34dbb9c57b540c49aeb2c.png)
Prometheus监控实战系列九:主机监控
Prometheus使用各种Exporter来监控资源。Exporter可以看成是监控的agent端,它负责收集对应资源的指标,并提供接口给到Prometheus读取。不同资源的监控对应不同的Exporter,如node-exporeter、mysql-exporter、kafka-exporter等,在这…...
![](https://img-blog.csdnimg.cn/20200923144503794.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xhb2Jhbmh1YW5naGU=,size_16,color_FFFFFF,t_70#pic_center)
JVM知识整理
JVM知识整理 JVM的主要组成部分 JVM包含两个两个子系统(类加载子系统和执行引擎)和两个组件(运行时数据区与和本地库接口) 类加载子系统:根据给定的全限定类名来加载class文件到运行时数据区域中的方法区。执行引擎&a…...
![](https://img-blog.csdnimg.cn/288c91e3f7ae4b9b94fb132e4b83ed82.png)
【C++】二叉搜索树
A:你长大后想要做什么? B:写下“快乐”…… A:不,你理解错我的意思了,我是说 B:不,是你理解错了人生…… 文章目录一、二叉搜索树的实现1.struct TreeNode{}2.迭代版本2.1 Insert()插入结点(解决链接的问题)…...
![](https://img-blog.csdnimg.cn/3efd8d1235984a24b18f69c5004244e3.png)
leetcode -- 21. 合并两个有序链表
🐨目录📑1. 题目🛶2. 解法- 头插到新链表🐬2.1 思路🐬2.1 代码实现⛵3. 解法优化 - 带哨兵位🐋3.1 思路🐋3.2 代码实现🚤4. 题目链接📑1. 题目 将两个升序链表合并为一个…...
![](https://img-blog.csdnimg.cn/93b4e23816b247f689aa3e3b75004ef5.png)
计算机组成原理|第四章(笔记)
目录第四章 存储器4.1 概述4.1.1 存储器分类4.1.2 存储器的层次结构4.2 主存储器4.2.1 概述4.2.2 半导体存储芯片简介4.2.3 随机存取存储器(RAM)4.2.4 只读存储器(ROM)4.2.5 存储器与CPU的连接4.2.6 存储器的校验4.2.7 提高访存速…...
![](https://img-blog.csdnimg.cn/3275fec8a0ad4e57a4ae1f614285795e.png)
【Unity3D-BUG记录】Unity3D中出现“动画片段必须标记为Legacy的警告”消除方法
推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 在开发中可能会遇到下面的警告: The AnimationClip…...
![](https://www.ngui.cc/images/no-images.jpg)
Spring Bean的定义(含创建Bean的三种方式)
🏆 文章目标:复习和理解下Spring Bean的定义 🍀 Spring Bean的定义(含创建Bean的三种方式) ✅ 创作者:Jay… 🎉 个人主页:Jay的个人主页 🍁 展望:若本篇讲解内…...
![](https://img-blog.csdnimg.cn/773509cc8ad84b9c99c7cc1aee07a079.png)
vue的路由-vue router(一)
vue的路由-vue router一、路由的基本使用HTMLrouter-linkrouter-viewJavaScript二、带参数的动态路由匹配三、嵌套路由四. 编程式导航导航到不同的位置替换当前位置横跨历史篡改历史五. 命名路由六. 命名视图嵌套命名视图七. 重定向和别名重定向别名八. 将 props 传递给路由组件…...
![](https://img-blog.csdnimg.cn/img_convert/64261a1c19d74bc98eadd74e51fe0cc0.png)
DevOps流水线搭建-PHP版本
一、介绍流水线发布代码1、官网https://www.jenkins.io/zh2、kubesphere里的介绍https://kubesphere.io/zh/docs/v3.3/devops-user-guide/how-to-use/pipelines/choose-jenkins-agent/3、git仓库可以自己写点测试代码,提交,待会测试用https://gitee.com/…...
![](https://www.ngui.cc/images/no-images.jpg)
C语言之按位取反~(七十一)
计算机存储数据基本知识计算机中二进制数包括(正数和负数)是以补码形式存储。符号位:补码的最左侧首位是符号位,0表示正数,1表示负数。二进制有三种形式:原码、反码、补码。正数的补码和反码:是…...
![](https://www.ngui.cc/images/no-images.jpg)
C# 委托
Action 在 C# 中,Action 是一个预定义的委托类型,表示一个不带参数和返回值的方法。它的定义如下: public delegate void Action();Action 委托可以用于表示任何没有参数和返回值的方法。例如: // 定义一个不带参数和返回值的方…...
![](https://www.ngui.cc/images/no-images.jpg)
leetcode究极刷题笔记(11~15)
(11)盛最多水的容器(中等) 实现思路: 定义两个指针(a,b),分别指向数组的前后位置,如果此时a的值小于b的话,就将a右移一位,如果此时b指向的值小于…...
![](https://www.ngui.cc/images/no-images.jpg)
【C语言】一篇带你从零了解 枚举
文章目录什么是枚举枚举类型的定义枚举的优点枚举的使用什么是枚举 枚举是 C 语言中的一种基本数据类型 可以让数据更简洁,更易读。 枚举顾名思义就是 一 一 列举。 把可能的取值 一 一列举。 比如我们现实生活中: 一周的星期一到星期日是有限的7天&…...
![](https://img-blog.csdnimg.cn/4136a13fd6d34acc98bd47c964b17735.png)
用Pytorch搭建一个房价预测模型
本文参加新星计划人工智能(Pytorch)赛道:https://bbs.csdn.net/topics/613989052 目录 一、项目介绍 二、准备工作 三、实验过程 3.1数据预处理 3.2拆分数据集 3.3构建PyTorch模型 3.3.1.数据转换 3.3.2定义模型架构 3.3.3定义损失准则和优化器 3.3.4创建…...
![](https://img-blog.csdnimg.cn/1dcb12662eb34d2aaf5d09a4a6551ebf.png)
《Netty》从零开始学netty源码(十五)之ServerSocketChannel
在NioServerSocketChannel中调用newChannel方法创建java原生的channel,过程如下: ServerSocketChannel是一个抽象类,WEPollSelectorProvider调用openServerSocketChannel方法创建的是它的实现类ServerSocketChannelImpl,类结构如下…...
![](https://img-blog.csdnimg.cn/2b637003865945b1ab8d0f9150fead44.png)
Java stream性能比较
环境 Ubuntu 22.04IntelliJ IDEA 2022.1.3JDK 17CPU:8核 ➜ ~ cat /proc/cpuinfo | egrep -ie physical id|cpu cores physical id : 0 cpu cores : 1 physical id : 2 cpu cores : 1 physical id : 4 cpu cores : 1 physical id : 6 cpu cores : 1 physical id …...
![](https://img-blog.csdnimg.cn/img_convert/4d91c43bfc72ca913299809b07b4968f.gif)
做擦边球网站赚钱么/在线h5免费制作网站
计算机应用基础(Windows XPOffice 2003)、素材和习题答案-王向慧 计算机应用基础 (447页)本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!9.90 积分第1章 上页 下页 目录 退出 目 目 录 录 第1章 计算机…...
![](/images/no-images.jpg)
网络营销公司排行/网站seo优化方法
Hibernate之Cache学习笔记 Hibernate 中实现了良好的Cache 机制,我们可以借助Hibernate 内部的Cache迅速提高系统数据读取性能。 需要注意的是:Hibernate做为一个应用级的数据访问层封装,只能在其作用范围内保持Cache中数据的的有效性&#…...
![](/images/no-images.jpg)
萧山做网站哪里找/百度广告联盟价格
史前时期 20 世纪 60 年代,美国国防部高等研究计划署(ARPA)建立了 ARPA 网,它有四个分布在各地的节点,被认为是如今互联网的“始祖”。 然后在 70 年代,基于对 ARPA 网的实践和思考,研究人员发明出了著名的 TCP/IP 协议。由于具有良好的分层结构和稳定的性能,TCP/IP …...
![](https://img-blog.csdnimg.cn/img_convert/4e0e41c0e4a70e2b2593b79276a3ab44.gif)
无锡网站建设价格费用/win7优化软件
概述一般我们讲的虚拟化有两种类型:Hypervisor直接在安装在宿主机的逻辑上:Hypervisor 直接安装在物理机上,多个虚拟机在 Hypervisor 上运行。Hypervisor 实现方式一般是一个特殊定制的 Linux 系统。Xen 和 VMWare 的 ESXi 都属于这个类型。K…...
![](/images/no-images.jpg)
做网站构架用什么软件/google推广一年的费用
在找软件设计师考试试题和答案的时候发现了这个网站,发现是个很不错的网站,在此我可以和同行们一起交流经验,心得.转载于:https://blog.51cto.com/5dreamfly/91995...
![](https://img-blog.csdnimg.cn/img_convert/9a388a681eb8925042221de5ed000cf1.png)
网站开发线上/网站推广app下载
数据分析师为什么这么火?麦肯锡称:“数据,已经渗透到当今每一个行业和业务职能领域,成为重要的生产因素。”确实,在商业迅速发展的今天,越来越多的领域都需要做数据分析。可以说,现代社会几乎无…...