阅读更多

43顶
5踩

行业应用

原创新闻 Apple公司的股票市值已经超过了IBM

2009-09-10 14:08 by 见习编辑 robbin 评论(53) 有15765人浏览


上图是查阅IT公司的股价和股票市值。Apple公司的股票市值达到了1533亿美元,超过了IBM公司的市值1531亿美元。距离微软公司2208亿美元尚有675亿美元差距。而在IBM之下的是Google公司的市值1469亿美元,Cisco的1284亿美元和Oracle公司的1128亿美元。

苹果公司的市值超越了IBM这是一个很有历史意义的时刻。因为苹果公司在创办之初的目标就是击败IBM,在1983年斯蒂夫乔布斯造访IBM公司的时候,还特地在IBM纽约总部的logo前面留下了著名的“Fu-ck IBM”的照片,随后1984年苹果的Macintosh上市著名的《1984》广告也是针对IBM的:


但是随着IBM PC时代的来临,在微软和IBM PC兼容机厂商的联盟之下,苹果公司纵然做出来Macintosh这样的惊世之作,也难逃没落的命运。

然而世事难料,在15年后的今天,苹果公司终究还是凭借一系列创新的消费电子产品最终实现了跨越IBM的梦想,下一个不知道是不是苹果这些年的老对手微软公司了。
  • 大小: 35.8 KB
43
5
评论 共 53 条 请登录后发表评论
53 楼 jkfzero 2009-09-13 23:50
lordhong 写道
苹果你要顶住啊~~~ 一年保守点升个5%就可以了... 我的退休金就指望你了...

红哥真的是苹果股东?
52 楼 lordhong 2009-09-13 22:39
苹果你要顶住啊~~~ 一年保守点升个5%就可以了... 我的退休金就指望你了...
51 楼 sjpsega 2009-09-13 22:29
都是很厉害的很厉害的公司啊~
50 楼 zdyujia 2009-09-13 11:20
wangxin0072000 写道
我记得IT企业,市值第一的不是 中国移动 吗?


这位仁兄,典型的冷笑话大王!
49 楼 cyberblue 2009-09-12 20:43
zozoh 写道
oowei 写道
苹果现在很成功,但他的战略有很多的危险性,一个是太依赖乔布斯。另一个才是最致命的,就是苹果的产品必须要一个接一个的成功,追求完美是苹果的风格,是一个又一个完美的产品造就了现在的苹果,这种风格注定了他的客户不能接受他的失败。微软可以有失败的vista,但apple不能有失败的ipod、iphone,否则,他会成为最大的泡沫。

苹果失败的产品还少吗?


呵呵,至少Apple Server就失败了。
48 楼 lordhong 2009-09-12 20:19
vwpolo 写道
苹果的股价有时大起大落,而IBM的股价这十年来都很稳定,

苹果股票5年涨了400%... 比google要好...
47 楼 vwpolo 2009-09-12 18:13
苹果的股价有时大起大落,而IBM的股价这十年来都很稳定,
46 楼 smiletuna 2009-09-12 15:14
IBM的 研发还是非常非常厉害的。。

现在主流的游戏机芯片不都是出自这个公司的么?
45 楼 murainwood 2009-09-12 14:49
jkfzero 写道
nerv828 写道
战士归来,传奇还将继续...
wangxin0072000 写道
IBM 除了忽悠,还有什么?
---
硬件基本和其他几家没什么差别
操作系统 没用过,不好评判
商业软件---------就是一个大忽悠
开源软件---------eclipse之后再没什么大动作了

.........................................
无语,把无知当个性........
..........................

一般菜鸟新手都是这样的,都是左脚踩着IBM,右脚踏着微软,手里抓着Sun,大喊:老子天下第一

能列举一下事实么?别老拿无知当个性。

44 楼 robbin 2009-09-12 11:09
wind.ldr 写道
jkfzero 写道
nerv828 写道
战士归来,传奇还将继续...
wangxin0072000 写道
IBM 除了忽悠,还有什么?
---
硬件基本和其他几家没什么差别
操作系统 没用过,不好评判
商业软件---------就是一个大忽悠
开源软件---------eclipse之后再没什么大动作了

.........................................
无语,把无知当个性........
..........................


能列举一下事实么?别老拿无知当个性。

amd k7的前端总线技术(据说第一次超越i的) 是ibm实验室出来的

人家卖的是技术


k7的前端总线技术是买的DEC淘汰掉的Alpha EV6总线技术。DEC是IBM的老对手了。
43 楼 hellman1984 2009-09-12 10:15
好像ibm在纳米技术上也是相当牛的
42 楼 wind.ldr 2009-09-12 09:29
jkfzero 写道
nerv828 写道
战士归来,传奇还将继续...
wangxin0072000 写道
IBM 除了忽悠,还有什么?
---
硬件基本和其他几家没什么差别
操作系统 没用过,不好评判
商业软件---------就是一个大忽悠
开源软件---------eclipse之后再没什么大动作了

.........................................
无语,把无知当个性........
..........................


能列举一下事实么?别老拿无知当个性。

amd k7的前端总线技术(据说第一次超越i的) 是ibm实验室出来的

人家卖的是技术
41 楼 hellman1984 2009-09-12 06:43
2000年左右的sun的市值好像更大吧
40 楼 flysheet 2009-09-11 20:20
这照片,太屌啦
39 楼 jkfzero 2009-09-11 19:45
nerv828 写道
战士归来,传奇还将继续...
wangxin0072000 写道
IBM 除了忽悠,还有什么?
---
硬件基本和其他几家没什么差别
操作系统 没用过,不好评判
商业软件---------就是一个大忽悠
开源软件---------eclipse之后再没什么大动作了

.........................................
无语,把无知当个性........
..........................


能列举一下事实么?别老拿无知当个性。
38 楼 zyzdy 2009-09-11 18:13
kao一二个产品冲上去的,是不能酒精考验的,IBM在经济周期的抗性方面不知道比其强了多少倍。
37 楼 samm 2009-09-11 17:44
SUN的市值是多么的少 哎
36 楼 samm 2009-09-11 17:40
是阿,感觉apple的基础不如ibm
wangxin0072000 写道
我记得IT企业,市值第一的不是 中国移动 吗?

伟大的银行才是
35 楼 quentinyi 2009-09-11 17:39
两个品牌的产品各有特色
他们的产品没有绝对的竞争关系
apple的个人消费品很出色
ibm做企业客户
34 楼 nerv828 2009-09-11 16:36
战士归来,传奇还将继续...
wangxin0072000 写道
IBM 除了忽悠,还有什么?
---
硬件基本和其他几家没什么差别
操作系统 没用过,不好评判
商业软件---------就是一个大忽悠
开源软件---------eclipse之后再没什么大动作了

.........................................
无语,把无知当个性........
..........................

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 消息队列通信设计

    实验报告七:(1)设计 InputTask、ComputeTask 和 OutputTask 三个任务,InputTask 任务负责从键盘接收两个整数 a 和 b 及操作符 op(+-*/),ComputeTask 负责计算 a(+-*/)b,OutputTask 任务负责输出计算结果。要求 InputTask 和 ComputeTask 间通信及 ComputeTask 和 OutputTask 间通信都用消息邮箱实现。提示:把 a、b 和 op 拼接成 1 个消息。 (2)设计 InputTask、ComputeTask 和 OutputTask 三个任务,InputTask 任务负责从键盘接收两个整数 a 和 b 及操作符 op(+-*/),ComputeTask 负责计算 a(+-*/)b,OutputTask 任务负责输出计算结果。要求 InputTask 和 ComputeTask 间通信用消息队列实现,ComputeTask 和 OutputTask 间通信用消息邮箱实现。提示:把 a、b 和 op 解析成 3 个消息。用到的主要函数:OSMboxCreate、 OSMboxPost、OSMboxPend、OSQCreate、OSQPostOSQPend

  • 架构训练营-设计消息队列存储消息数据的表格

    消息队列

  • 消息队列

    一、什么是消息队列 我们可以把消息队列比作是一个存放消息的容器,当我们需要使用消息的时候可以取出消息供自己使用。消息队列是分布式系统中重要的组件,使用消息队列主要是为了通过异步处理提高系统性能和削峰、降低系统耦合性。 目前使用较多的消息队列有ActiveMQ,RabbitMQ,Kafka,RocketMQ。 二、为什么要用消息队列 我觉得使用消息队列主要有两点好处: 1、通过异步处...

  • 一文看懂:什么是消息队列?从基础到进阶的全面解析

    消息队列作为现代分布式系统的关键组件,从基础到进阶的全面解析中占据了核心位置。它不仅解决了高并发请求下的性能瓶颈问题,还极大地促进了不同服务之间的解耦。例如,在电商领域,通过消息队列可以有效地异步处理订单信息至库存管理和支付处理等环节,显著提高响应速度和稳定性。选择合适的队列如RabbitMQ、Kafka或RocketMQ需基于特定需求,比如路由规则复杂度、数据量大小及实时性要求等因素。理解什么是消息队列及其特点对于做出最佳决策至关重要。此外,面对自建与商用的选择时,考虑到长期维护成本和技术支持的重要性,采

  • 消息队列——RabbitMq

    一、消息队列的使用场景 一、消息队列的使用场景) 一、消息队列的使用场景 异步处理 应用解耦 流量削锋 消息通讯 【1】异步处理:场景说明:用户注册后,需要发注册邮件和注册短信。 引入消息队列后架构如下:用户的响应时间=注册信息写入数据库的时间,例如50毫秒。发注册邮箱、发注册短信写入消息队列后,直接返回客户端,因写入消息队列的速度很快,基本可以忽略,因此用户的响应时间可能是50毫秒。 按照传统的做法: ①、串行方式,将注册信息写入数据库成功后,发注册邮件,再发送注册短信,以上三个成功后,返回客户端。可

  • 消息队列的介绍及配置

    消息队列的介绍及配置

  • 消息队列及常见消息队列介绍

    转载 消息队列及常见消息队列介绍 一、消息队列(MQ)概述 消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以简单地描述为: 当不需要立即获得结果,但是并发量又需要进行控制的时候,差不多就是需要使用消息队列的时候。 消息队列主要解决了应用耦合、异步处理、流量削锋等问题。 当前使用较多的消息队列有RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMq等,而部分数据库如Redis、Mysql以及phxsql也可实现消息队列

  • 通过消息队列进行通信(嵌入式学习)

    消息队列的发送进程和接收进程是相互独立的,它们可以以不同的速度进行消息的发送和接收。顺序性:消息队列保持消息的顺序性,即按照发送的顺序将消息放入队列,并按照相同的顺序进行接收。即使发送进程发送消息的速度快于接收进程处理消息的速度,消息队列也能够缓冲未被接收的消息,避免消息的丢失。多对多通信:消息队列支持多对多的通信模式,即多个发送进程可以同时向同一个队列发送消息,多个接收进程可以从同一个队列接收消息。持久性:消息队列可以具有持久性,即在消息发送完成后,消息可以保留在队列中,直到被接收进程读取。

  • 嵌入式学习——进程间通信方式(4)—— 消息队列

    消息队列是一个进程向另一个进程发送一个数据块,每个数据块都含有一个类型,接收方可以接收自己想要的消息类型。消息队列、信号的区别:信号能承载的数据量较小,而队列能够存放大量自定义的数据。消息队列、管道的区别:① 、有名管道和消息队列都可以通过不同进程传输数据,都是要发送和接收数据,但是有名管道利用的是read()、write()函数,而消息队列则是通过msgsnd()、msgrev()。②、管道只能传输无字节流的数据,而消息队列可以支持各种类型的数据,有格式的字节流。

  • [嵌入式系统-58]:RT-Thread-内核:线程间通信,邮箱mailbox、消息队列MsgQueue、信号Signal

    目录 线程间通信 1. 邮箱 1.1 邮箱的工作机制 1.2 邮箱控制块 1.3 邮箱的管理方式 (1)创建和删除邮箱 (2)初始化和脱离邮箱 (3)发送邮件 (4)等待方式发送邮件 (5)发送紧急邮件 (6)接收邮件 1.4 邮箱使用示例 1.5 邮箱的使用场合 2. 消息队列 2.1 消息队列的工作机制 2.2 消息队列控制块 2.3 消息队列的管理方式 (1)创建和删除消息队列 (2)初始化和脱离消息队列 (3)发送消息 (4)等待方式发送消息 (5)发送紧

  • 嵌入式操作系统内核原理和开发(消息队列)

    【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】       消息队列是线程交互的一种方法,任务可以通过消息队列来实现数据的沟通和交换。在嵌入式系统上,这可以说这是用的最多的一种方法。通过消息队列,无论是发送者,还是接受者都可以循环地处理各种消息。而我们知道,存储消息最好的方式就是循环队列,如果消息已满,那么发送者可以把自己pend到等待队列

  • Message消息队列中多个数据传递(Bundle)

    MyHandler handler = new MyHandler(handlerThread.getLooper()); Message msg = handler.obtainMessage(); /** * 将Message对象发送到目标对象 * 所谓的目标对象,就是生成该msg对象的handler对象 *

  • 嵌入式消息队列artemis

    1.依赖引入 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- springboot

  • 对嵌入式系统使用消息队列的一些认识

        由于项目需要,在嵌入式操作系统的中间件设计中,采用了消息队列来作为各个模块之间的通信方式,同时允许用户层的不同用户来访问中间件的各个模块。     现在列出下面三个问题来加深对消息队列的理解,以便后续的架构优化: 问题1:为什么要使用消息队列? 问题2:消息队列的优缺点? 问题3:如何增强消息队列使用的稳定性? 问题1:为什么会使用消息队列?      由于业务划分有用户层,中间层...

  • 嵌入式实验(消息队列)

    #include #include #include "vxWorks.h" #include "msgQLib.h" #include "taskLib.h" /*#include "memPartLib.h"*/ #include "memLib.h" /*宏定义*/ #define MAX_MSGS (10) /* the length of msg*/ #define MAX_MSG_LEN sizeof(MESSAGE) /*the length of message*/ #define STACK_SIZE 20000 /*the stack size of task*/ #define DELAY_TICKS 50 /*the time of sending message*/ #define MAX_point 5 /*用户从系统内存池中获得内存的最大次数*/ #define size_1 30 /*用户分区的分配的大小*/ #define size_2 40 /*全局变量*/ int tidtask1; int tidtask2; int tidtask3; SEM_ID syncSemId; SEM_ID waitSemId; MSG_Q_ID myMsgQId1; MSG_Q_ID myMsgQId2; MSG_Q_ID myMsgQId3; typedef struct _MESSAGE { int mSendId; /*发送任务 ID*/ int mRecvId; /*接收任务 ID*/ int mData; /*消息中传递的数据*/ char Data[14]; } MESSAGE; /*内存管理*/ char* usermem1; char* usermem2; MESSAGE *point1[MAX_point]; MESSAGE *point2[MAX_point]; MESSAGE *point3[MAX_point]; int point1_index=0; int point2_index=0; int point3_index=0; PART_ID partid1; PART_ID partid2; #define MID_MESSAGE(id) (id) /*函数声明*/ int start(void); int task1(void); int task2(void); int task3(void); template T* mymalloc(unsigned nBytes); void myfree(void); void bye(void); /***************************************[progStart]*******************************************/ /*启动程序,创建息队例,任务*/ int start(void) { tidtask1=taskSpawn("tTask1", 220, 0, STACK_SIZE, (FUNCPTR)task1,0,0,0,0,0,0,0,0,0,0); usermem1=malloc(200); partid1=memPartCreate(usermem1,200); usermem2=malloc(400); partid2=memPartCreate(usermem2,400); return; } /**************************************[test_end]********************************************/ /*是否相等,相等返回1*/ int test_end(char *end,char *target) { int ret; if(!strcmp(end,target)) ret=1; else ret=0; return ret; } /****************************************[task1]***********************************************/ /*管理Task。负责系统启动时同步系统中其他Task的启动同步,利用信号量的semFlush()完成。同时接收各*/ /*Task的告警信息,告警信息需编号以logmsg方式输出。本task负责系统结束时的Task删除处理*/ int task1(void) { int singal; int message; MESSAGE *rxMsg=mymalloc(26); /*define messages,and alloc memory*/ memset(rxMsg,0,26); syncSemId=semBCreate(SEM_Q_FIFO,SEM_EMPTY); /*creat semaphore*/ waitSemId=semBCreate(SEM_Q_PRIORITY,SEM_EMPTY); myMsgQId1=msgQCreate(MAX_MSGS,MAX_MSG_LEN,MSG_Q_PRIORITY); /*create msgQ*/ myMsgQId2=msgQCreate(MAX_MSGS,MAX_MSG_LEN,MSG_Q_PRIORITY); myMsgQId3=msgQCreate(MAX_MSGS,MAX_MSG_LEN,MSG_Q_PRIORITY); tidtask2=taskSpawn("tTask2", 200, 0, STACK_SIZE, (FUNCPTR)task2,0,0,0,0,0,0,0,0,0,0); /*create task*/ tidtask3=taskSpawn("tTask3", 210, 0, STACK_SIZE, (FUNCPTR)task3,0,0,0,0,0,0,0,0,0,0); printf("Please input one of the following commands:add,sub,multiply,divide,testcommand\n"); /*the command we should put into the console*/ semFlush(syncSemId); /*release semaphore*/ semGive(waitSemId); while(1) { singal=1; msgQReceive(myMsgQId1,(char*)&rxMsg,sizeof(rxMsg),WAIT_FOREVER); if(rxMsg->mRecvId==MID_MESSAGE(3)) /*receive MsgQ from task3*/ { singal=test_end(rxMsg->Data,"wrong length")-1; logMsg("task3 receiveing a:%s\n",rxMsg->Data); /*put the warn from task3*/ logMsg("Please reput the other command!\n"); msgQReceive(myMsgQId1,(char*)&rxMsg,MAX_MSG_LEN,WAIT_FOREVER); /*recive MsgQ from task3*/ } if(rxMsg->mRecvId==MID_MESSAGE(2)) /*receive MsgQ from task2*/ { message=test_end(rxMsg->Data,"sysend"); if(message) { /*if the message from task2 is "sysend" and did not receive the warn from task3, close the system*/ if(singal) { bye(); } } else {/*if the message from task2 is "sysend" and receive the warn from task3, reput the command*/ if(singal) logMsg("task2 receiveing a %s\n",rxMsg->Data); logMsg("please reput the correct command!\n"); } } } return; } /********************************************************************************************/ int change_buf(char *command) { int ret; if(!strcmp(command,"add")) ret=1; else if(!strcmp(command,"sub")) ret=2; else if(!strcmp(command,"multiply")) ret=3; else if(!strcmp(command,"divide")) ret=4; else if(!strcmp(command,"testcommand")) ret=5; else ret=0; return ret; } /****************************************[task2]*********************************************/ /*console 命令行接收Task。接收并分析console发来的命令行及参数。自行设置5种以上命令,并根据命*/ /*令的内容向Task3发送激励消息。同时实现系统退出命令,使系统采用适当方式安全退出。收到非法命令*/ /*向Task1告警*/ int task2(void) { char buf[100]; int command; char *str=mymalloc(35); MESSAGE *txMsg=mymalloc(26); memset(str,0,35); memset(txMsg,0,26); txMsg->mSendId=MID_MESSAGE(2); txMsg->mRecvId=MID_MESSAGE(2); FOREVER { semTake(syncSemId,WAIT_FOREVER); semTake(waitSemId,WAIT_FOREVER); gets(buf); command=change_buf(buf);/*change the commands into numbers*/ switch(command) { case 0:/*receive uncorrect command*/ txMsg->mData=0; strcpy(txMsg->Data,"wrong command");/*send warn to task1*/ msgQSend(myMsgQId1,(char*)&txMsg,sizeof(txMsg),WAIT_FOREVER,MSG_PRI_NORMAL); break; case 1:/*receive add command*/ strcpy(str,"This an add caculate!\0"); txMsg->mData=1; break; case 2:/*receive sub command*/ strcpy(str,"This a sub caculate!\0"); txMsg->mData=2; break; case 3:/*receive multiply command*/ strcpy(str,"This a multiply caculate!\0"); txMsg->mData=3; break; case 4:/*receive divide command*/ strcpy(str,"This a divide caculate!\0"); txMsg->mData=4; break; case 5:/*receive testcommand,send a long string to task3*/ strcpy(str,"This a testcommand to warn task1!\0"); txMsg->mData=5; break; default: break; } if(txMsg->mData!=0) {/*send along string to task3,and send a message to taks3*/ msgQSend(myMsgQId3,(char*)&str,sizeof(str),WAIT_FOREVER,MSG_PRI_NORMAL); msgQSend(myMsgQId3,(char*)&txMsg,sizeof(txMsg),WAIT_FOREVER,MSG_PRI_NORMAL); } semGive(waitSemId); semGive(syncSemId); taskDelay(DELAY_TICKS); if(txMsg->mData!=0) {/*send sysend to task1 to let task1 close system*/ strcpy(txMsg->Data,"sysend"); msgQSend(myMsgQId1,(char*)&txMsg,sizeof(txMsg),WAIT_FOREVER,MSG_PRI_NORMAL); } } return; } /****************************************[task3]********************************************/ /*console输出Task。接收需打印输出的字串消息(命令),输出到console。收到长度为0或超常字串向*/ /*Task1告警*/ int task3(void) { int firstData=100; int secondData=10; MESSAGE *rxMsg=mymalloc(26); MESSAGE *txMsg=mymalloc(26); char *rstr=mymalloc(35); memset(txMsg,0,26); memset(txMsg,0,26); memset(rstr,0,35); txMsg->mSendId=MID_MESSAGE(3); txMsg->mRecvId=MID_MESSAGE(3); while(1) { semTake(syncSemId,WAIT_FOREVER); msgQReceive(myMsgQId3,(char*)&rstr,sizeof(rstr),WAIT_FOREVER); if(strlen(rstr)=26) {/*make sure whether the string is too long or short*/ strcpy(txMsg->Data,"wrong length"); msgQSend(myMsgQId1,(char*)&txMsg,sizeof(txMsg),WAIT_FOREVER,MSG_PRI_NORMAL); /*msgQReceive(myMsgQId3,(char*)&rxMsg,sizeof(rxMsg),WAIT_FOREVER);*/ } semTake(waitSemId,WAIT_FOREVER); msgQReceive(myMsgQId3,(char*)&rxMsg,sizeof(rxMsg),WAIT_FOREVER); if(rxMsg->mData!=5) {/*when it is not testcommand,printf these*/ printf("%s\n",rstr); printf("there are two datas!\n"); printf("firstData:100\n"); printf("secondData:10\n"); } switch(rxMsg->mData) { case 1:/*printf add caculate*/ printf("The result is:%d\n",firstData+secondData); break; case 2:/*printf sub caculate*/ printf("The result is:%d\n",firstData-secondData); break; case 3:/*printf multiply caculate*/ printf("The result is:%d\n",firstData*secondData); break; case 4:/*printf divide caculate*/ printf("The result is:%d\n",firstData/secondData); break; case 5: break; default: break; } semGive(waitSemId); semGive(syncSemId); taskDelay(DELAY_TICKS); } return; } template T* mymalloc(unsigned nBytes) { T* point; int i=0; /*用户分区一是否能分配的标志位*/ int j=0; /*用户分区二是否能分配的标志位*/ if(nBytes=size_1 && nBytes=size_2) && point3_index<MAX_point) /*若用户分区二不能分配,由系统内存池来分配,且只能从系统内存池中分配MAX_point次*/ { point=malloc(nBytes); point3[point3_index]=point; printf("the number of the point3_index is:%d\n",point3_index); point3_index++; } return point; } void myfree(void) { int i=0; for (i=0;i<point1_index;i++) { memPartFree(partid1,point1[i]); } for (i=0;i<point2_index;i++) { memPartFree(partid2,point2[i]); } for (i=0;i<point3_index;i++) { free(point3[i]); } free(usermem1); free(usermem2); printf("The memory have freed!\n"); } void bye(void) { myfree(); logMsg("Bye-bye\n"); taskDelete(tidtask2); taskDelete(tidtask3); msgQDelete(myMsgQId1); msgQDelete(myMsgQId2); msgQDelete(myMsgQId3); semDelete(syncSemId); taskDelete(tidtask1); }

  • Visio绘制事件图

    为什么要绘制事件图? 对程序员来说,我们需要知道一个事件(或者一个函数)需要由什么驱动(或者由什么对象传递参数进来),处理后的结果要给谁(比如返回结果给一个对象,或者数据库的增删改)。事件图就是描述一个事件的上下文的数据流图。事件图中明确地指出输入来源和输出来源。    如何用Visio2010绘制事件图? 1、因为事件图本质上是数据流图中的一种。所以选择数据流模型图。   2、因...

  • 单片机 裸奔 模拟多任务调度模型 :消息队列 + 状态机 + 定时器

    对于简单的嵌入式应用多数裸奔就能解决,但写出来的裸奔代码质量也由好坏之分。 在网上看到了这样一篇文字: 上面说到了裸奔环境下的多任务模型 - stateMachine + timerTick + Queue,也提到具体怎么做。 伪代码实现 //消息类型 enum MessageType { MSG_USART1, MSG_USART3, MSG_20MS = 20, MSG_100MS = 100, }; typedef enum MessgeType enMsgType stMsgQueue

  • 图解RocketMQ消息发送和存储流程

    基本概念 参考官网文档 整体架构 Producer:生产者 Consumer:消费者 Broker:负责消息存储、投递、查询 NameServer:路由注册中心。功能包括:Broker管理、路由信息管理 模块间数据流转 生产-消费模型 消息发送流程 Broker启动时,向NameServer注册信息 客户端调用producer发送消息时,会先从NameServer获取该top...

  • Web应用中的轻量级消息队列

    Web应用中为什么会需要消息队列?主要原因是由于在高并发环境下,由于来不及同步处理,请求往往会发生堵塞,比如说,大量的insert,update 之类的请求同时到达mysql,直接导致无数的行锁表锁,甚至最后请求会堆积过多,从而触发too many connections错误。通过使用消息队列,我们可以异步处理请求,从而缓解系统的压力。在Web2.0的时代,高并发的情况越来越常见,从而使消息队列有

  • 消息队列使用的四种场景介绍

    原文地址:https://blog.csdn.net/cws1214/article/details/52922267 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题 实现高性能,高可用,可伸缩和最终一致性架构 使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ 二、消息队列应用场景 以下介...

Global site tag (gtag.js) - Google Analytics